/**
 * @file      : user_list.h
 * @brief     : 用户链表头文件
 * @author    : huenrong (huenrong1028@gmail.com)
 * @date      : 2021-04-09 15:48:38
 *
 * @copyright : Copyright (c) 2021 胡恩荣
 *
 */

#ifndef __USER_LIST_H
#define __USER_LIST_H

#include <stdint.h>

#include "../kernel_list/kernel_list.h"

#pragma pack(1)

// 用户链表头节点定义
struct user_list_head
{
    uint32_t len;          // 链表长度(注意与获取链表长度返回值匹配)
    struct list_head list; // 内核链表
};

// 用户链表节点数据
struct user_list_node_data
{
    char name[20]; // 姓名
    uint8_t age;   // 年龄
};

// 用户链表数据节点定义
struct user_list_node
{
    struct user_list_node_data node_data; // 节点数据
    struct list_head list;                // 内核链表
};

#pragma pack()

/**
 * @brief  用户链表初始化
 */
void user_list_init(void);

/**
 * @brief  用户链表插入数据(头插法)
 * @param  add_data: 输入参数, 待插入的数据
 * @return 成功: 0
 *         失败: -1
 */
int user_list_add(const struct user_list_node_data add_data);

/**
 * @brief  用户链表插入数据(尾插法)
 * @param  add_data: 输入参数, 待插入的数据
 * @return 成功: 0
 *         失败: -1
 */
int user_list_add_tail(const struct user_list_node_data add_data);

/**
 * @brief  遍历链表
 */
void user_list_for_each_entry_safe_function(void);

/**
 * @brief  用户链表删除节点(删除所有符合要求的节点)
 * @param  del_data: 输入参数, 待删除的节点数据
 */
void user_list_del(const struct user_list_node_data del_data);

/**
 * @brief  用户链表删除所有节点(不包括头节点)
 */
void user_list_del_all(void);

/**
 * @brief  判断链表是否为空
 * @return 0: 链表非空
 *         1: 链表为空
 */
int user_list_empty(void);

/**
 * @brief  获取用户链表长度
 * @return 链表长度
 */
uint32_t get_user_list_len(void);

/**
 * @brief  用户链表查找是否存在指定姓名信息
 * @param  terminal_id: 输入参数, 带查找设备
 * @return 0: 不存在
 *         1: 存在
 */
int user_list_find(const char *name);

/**
 * @brief  用户链表获取指定姓名对应的节点信息
 * @param  info: 输出参数, 获取到的节点信息
 * @param  name: 输入参数, 待获取信息的姓名
 * @return 成功: 0
 *         失败: -1
 */
int user_list_get_one_info(struct user_list_node_data *info,
                           const char *name);

/**
 * @brief  用户链表更新数据(不存在该节点, 则将数据插入链表)
 * @param  node_data: 输入参数, 待更新/插入的节点数据
 * @return 成功: 0
 *         失败: -1
 */
int user_list_update(const struct user_list_node_data node_data);

#endif // __USER_LIST_H
